﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов

// Возвращает реквизиты объекта, которые разрешается редактировать
// с помощью обработки группового изменения реквизитов.
//
// Возвращаемое значение:
//  Массив из Строка
//
Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт
	
	Результат = Новый Массив;
	Возврат Результат;
	
КонецФункции

// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов

#КонецОбласти

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

////////////////////////////////////////////////////////////////////////////////
// Обработчики обновления.

// Регистрирует на плане обмена ОбновлениеИнформационнойБазы объекты,
// которые необходимо обновить на новую версию.
//
Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст =
		"ВЫБРАТЬ
		|	ВопросыДляАнкетирования.Ссылка КАК Ссылка
		|ИЗ
		|	ПланВидовХарактеристик.ВопросыДляАнкетирования КАК ВопросыДляАнкетирования
		|ГДЕ
		|	(ВопросыДляАнкетирования.ВидПереключателя = ЗНАЧЕНИЕ(Перечисление.ВидыПереключателяВАнкетах.ПустаяСсылка)
		|			ИЛИ ВопросыДляАнкетирования.ВидФлажка = ЗНАЧЕНИЕ(Перечисление.ВидыФлажкаВАнкетах.ПустаяСсылка)
		|			ИЛИ ВопросыДляАнкетирования.МинимальноеЗначение <> 0
		|				И НЕ ВопросыДляАнкетирования.ИспользоватьМинимальноеЗначение
		|			ИЛИ ВопросыДляАнкетирования.МаксимальноеЗначение <> 0
		|				И НЕ ВопросыДляАнкетирования.ИспользоватьМаксимальноеЗначение)
		|	И НЕ ВопросыДляАнкетирования.ЭтоГруппа";
	
	Результат = Запрос.Выполнить().Выгрузить();
	МассивСсылок = Результат.ВыгрузитьКолонку("Ссылка");
	
	ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, МассивСсылок);
	
КонецПроцедуры

// Заполнить значение нового реквизита ВидПереключателя у плана видов характеристик ВопросыДляАнкетирования.
// 
Процедура ОбработатьДанныеДляПереходаНаНовуюВерсию(Параметры) Экспорт
	
	Выборка = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(Параметры.Очередь, "ПланВидовХарактеристик.ВопросыДляАнкетирования");
	ПроблемныхОбъектов = 0;
	ОбъектовОбработано = 0;
	
	Пока Выборка.Следующий() Цикл
		ПредставлениеСсылки = Строка(Выборка.Ссылка);
		Попытка
			
			ЗаполнитьНовыеРеквизиты(Выборка.Ссылка);
			ОбъектовОбработано = ОбъектовОбработано + 1;

		Исключение
			ПроблемныхОбъектов = ПроблемныхОбъектов + 1;
			ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Не удалось обработать вопрос для анкетирования %1 по причине:
					|%2'"), 
				ПредставлениеСсылки, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
			ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение,
				Метаданные.ПланыВидовХарактеристик.ВопросыДляАнкетирования, Выборка.Ссылка, ТекстСообщения);
		КонецПопытки;
		
	КонецЦикла;
	
	Параметры.ОбработкаЗавершена = ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(Параметры.Очередь, "ПланВидовХарактеристик.ВопросыДляАнкетирования");

	Если ОбъектовОбработано = 0 И ПроблемныхОбъектов <> 0 Тогда
		ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Не удалось обработать некоторые вопросы для анкетирования (пропущены): %1'"), 
				ПроблемныхОбъектов);
		ВызватьИсключение ТекстСообщения;
	Иначе
		ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Информация,
			Метаданные.ПланыВидовХарактеристик.ВопросыДляАнкетирования,,
				СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Обработана очередная порция вопросов для анкетирования: %1'"),
					ОбъектовОбработано));
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// Заполняет значения новых реквизитов ВидПереключателя и ВидФлажка у переданного объекта.
//   
// Параметры:
//   ВопросДляАнкетирования - ПланВидовХарактеристикСсылка.ВопросыДляАнкетирования 
//
Процедура ЗаполнитьНовыеРеквизиты(ВопросДляАнкетирования)
	
	НачатьТранзакцию();
	Попытка
	
		Блокировка = Новый БлокировкаДанных;
		ЭлементБлокировки = Блокировка.Добавить("ПланВидовХарактеристик.ВопросыДляАнкетирования");
		ЭлементБлокировки.УстановитьЗначение("Ссылка", ВопросДляАнкетирования);
		Блокировка.Заблокировать();
		
		Объект = ВопросДляАнкетирования.ПолучитьОбъект();
		
		Если Объект.ВидПереключателя = Перечисления.ВидыПереключателяВАнкетах.ПустаяСсылка() Тогда
			Объект.ВидПереключателя = Перечисления.ВидыПереключателяВАнкетах.Переключатель;
		КонецЕсли;
		
		Если Объект.ВидФлажка = Перечисления.ВидыФлажкаВАнкетах.ПустаяСсылка() Тогда
			Объект.ВидФлажка = Перечисления.ВидыФлажкаВАнкетах.Флажок;
		КонецЕсли;    
			
		Если ЗначениеЗаполнено(Объект.МинимальноеЗначение) Тогда
			Объект.ИспользоватьМинимальноеЗначение = Истина;
		КонецЕсли;
		
		Если ЗначениеЗаполнено(Объект.МаксимальноеЗначение) Тогда
			Объект.ИспользоватьМаксимальноеЗначение = Истина;
		КонецЕсли;
		
		ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект);
		
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;
	
КонецПроцедуры
	
#КонецОбласти

#КонецЕсли